<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\User;
use App\Models\DataTableModel\Icon;
use App\Models\DataTableModel\Folder;

class File extends Model
{
    use HasFactory;

    // 指定表名（如果模型名与表名不完全对应时）  
    protected $table = 'files';
    protected $casts = [
        'file_size' => 'int',
        'file_parent_folder_id' => 'int',
        'file_image_id' => 'int',
        'file_mod' => 'int',
        'user_id' => 'int',
        'group_id' => 'int'
    ];

    // 定义可批量赋值的属性  
    protected $fillable = [
        'file_name',
        'file_path',
        'file_type',
        'file_size',
        'file_state',
        'file_parent_folder_id',
        'file_alias',
        'file_image_id',
        'file_mod',
        'user_id',
        'group_id'
    ];

    // 定义时间戳字段的名称（如果与默认的不同）  
    const CREATED_AT = 'created_at';
    const UPDATED_AT = 'updated_at';

    // 如果需要，可以添加与其他模型的关联关系  
    // 例如，与User模型的关联  
    public function user()
    {
        return $this->belongsTo(User::class, 'user_id');
    }


    // 与icon模型的关联
    public function icon()
    {
        return $this->belongsTo(Icon::class, 'file_image_id', 'id');
    }

    // 在 File 模型中添加关联方法  
    public function folder()
    {
        // 假设文件表有一个 file_parent_folder_id 字段指向文件夹表的主键id
        return $this->belongsTo(Folder::class, 'file_parent_folder_id');
    }

    // 根据文件ID获取文件路径  
    public static function getFilePathById($fileId)
    {
        // 使用 find 方法查找文件记录  
        $file = self::find($fileId);
        // 检查文件是否存在  
        if ($file) {
            return ltrim($file->file_path, '/');
        }
        // 如果文件不存在，返回 null  
        return null;
    }


    public static function getFileNameById($fileId)
    {
        // 使用 find 方法查找文件记录  
        $file = self::find($fileId);
        // 检查文件是否存在  
        if ($file) {
            return $file->file_name;
        }
        // 如果文件不存在，返回 null  
        return null;
    }


    // 

    /* 
    在Laravel中，模型之间的关联关系用于描述数据库表之间的关系。在您给出的代码片段中，File模型通过user()
    和group()方法与User模型和Group模型建立了关联。这些关联方法允许您轻松地从一个模型访问与其相关联的其他模型
    的数据。

    1、user() 方法:
    这个方法定义了File模型与User模型之间的关联。由于files表中有一个user_id字段，这个字段很可能是指向users表中
    某个用户的外键。因此，$this->belongsTo(User::class, 'user_id')表示File模型属于一个User模型，通过user_id
    字段来建立这种关系。

    当您有一个File实例，并想获取与之关联的用户信息时，可以简单地调用$file->user，这将返回与该文件相关联的User模型
    实例。

    2、group() 方法:
    与user()方法类似，group()方法定义了File模型与Group模型之间的关联。这里假设files表中的group_id字段是
    指向groups表中某个组的外键。$this->belongsTo(Group::class, 'group_id')表明File模型还属于一个Group模型，
    关联通过group_id字段建立。

    同样地，如果您有一个File实例并希望获取与之关联的组信息，可以通过$file->group来实现，
    这将返回与文件相关联的Group模型实例。

    这些关联方法极大地简化了在Eloquent模型中处理相关数据的复杂性，使得开发者能够以一种更加直观和面向对象的方式来
    操作数据库中的关联数据。
     */
}
